package com.mrogrape.gui;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Area;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;


public class WaveAnimationPainter implements AnimationPainter {

	/**
	 * 以默认值构建波浪动画绘制器
	 */
	public WaveAnimationPainter(){
		this(Color.WHITE, Color.ORANGE, 200);
	}
	
	/**
	 * 创建波浪动画绘制器并制定背景色，波色和波的宽度。
	 * 
	 * @param bgColor 背景色
	 * @param color 波色
	 * @param width 波的宽度
	 */
	public WaveAnimationPainter(Color bgColor, Color color, int width){
		
		// 参数验证
		if(bgColor == null||color == null){
			throw new NullPointerException("Color cannot be null");
		}
		
		if(width <= 0){
			throw new IllegalArgumentException("Width can not be zero or less than.");
			
		}
		
		this.backgroundColor = bgColor;
		this.color = color;
		this.waveWidth = width;
	}

	/**
	 * 获取波的宽度。
	 * 
	 * @return 波的宽度。
	 */
	public int getWaveWidth() {
		return this.waveWidth;
	}

	/**
	 * 设置波的宽度，以像素为单位。
	 * 
	 * @param waveWidth 波的宽度，以像素为单位。
	 */
	public void setWaveWidth(int waveWidth) {
		this.waveWidth = waveWidth;
	}

	/**
	 * 获取波的颜色。
	 * 
	 * @return 波的颜色。
	 */
	public Color getColor() {
		return this.color;
	}

	/**
	 * 设置波的颜色。
	 * 
	 * @param color 波的颜色。
	 */
	public void setColor(Color color) {
		this.color = color;
	}

	/**
	 * 获取背景色。
	 * 
	 * @return 背景色。
	 */
	public Color getBackgroundColor() {
		return this.backgroundColor;
	}

	/**
	 * 设置背景色。
	 * 
	 * @param backgroundColor 背景色。
	 */
	public void setBackgroundColor(Color backgroundColor) {
		this.backgroundColor = backgroundColor;
	}

	@Override
	public void paintCurrentFrame(Graphics g, int x, int y, int width,
			int height, boolean isReset, boolean isKeep) {
		
		Graphics2D g2d = (Graphics2D) g;
		
		// 重置绘制状态
		if(isReset){this.currentBasePoint = 0;};
		
		// 绘制背景色
		g.setColor(this.backgroundColor);
		g.fillRect(0, 0, width, height);
		
		// 计算位置
		int paintStartX = this.currentBasePoint - this.waveWidth + x;
		int paintCenterX = this.currentBasePoint - this.waveWidth / 2 + x;
		int paintEndX = this.currentBasePoint + x;
		
		// 绘制左边矩形
		Area leftArea = new Area(new Rectangle2D.Double(paintStartX, y, this.waveWidth/2, height));
		g2d.setPaint(new GradientPaint(new Point2D.Double(paintStartX,0), this.backgroundColor, new Point2D.Double(paintCenterX, 0), this.color,true));
		g2d.fill(leftArea);
		
		// 绘制右侧区域
		Area rightArea = new Area(new Rectangle2D.Double(paintCenterX , y, this.waveWidth/2, height));
		g2d.setPaint(new GradientPaint(new Point2D.Double(paintCenterX,0), this.color, new Point2D.Double(paintEndX, 0), this.backgroundColor,true));
		g2d.fill(rightArea);

		// 更新绘制状态
		if(this.currentBasePoint >= width + this.waveWidth){
			this.currentBasePoint = 0;
		}
		else if(!isKeep){
			this.currentBasePoint +=3;
		}
	}
	
	private int waveWidth = 200;
	private Color color = null;
	private Color backgroundColor = null;
	

	private int currentBasePoint = 0;
}
